

// always requires an idle view 
#include "kb.h"
#include "touch_algorithm.h"
#include "custom_event.h"
#include "gui.h"

#include "views.h"

#include "xapp_battery.h"
#include "xapp_clock.h"
#include "xapp_system.h"
#include "xapp_osllv.h"
#include "log.h"

#define LOG     LOG_INFO0 
#define LOG1    LOG_INFO1

// 定时功能界面的延时显示，超过此时间显示表盘
#define IDLE_SHOW_FUNC_VIEW_SECONDS_DELAY       (10)

GUI_VIEW_FUNC_DECLARE_ALL;


const static ui_widgets_type_t wglIdle[] = 
{
    uiCanvas( 0, 0, GUI_LCD_RES_H, GUI_LCD_RES_V, COLOR_BLACK ) 
};

GUI_VIEW_DEF_NR( manageIdle ) = 
{
    // name 
    .name = "Manage+idle",
    
    // init 
    .init = initialize,
    .display_func = display_callback_func,
    .refresh_func_check = display_refresh_func,
    .destroy_func = on_destroy_func,
    .set_parent_func = on_set_parent_func, 
    
    // input 
    .on_touch = on_touch,
    .on_button = on_button,
    .on_event_update = on_event_update,     
    
    .pWidgetlist =  (ui_widgets_type_t*)wglIdle ,
    .widget_cnt = WIDGET_COUNT( wglIdle ),

    .flag = GUI_VIEW_FLAG_NONE
};

static uint32_t m_idle_timestamp;

/* 当前view初始化
// 需要指定前使用的控件组
// 自动更新间隔，不使用自动更新间隔则interval = 0
// 指定生命周期，生命周期结束后自动调用 destroy， 测试过程中，可以将Lifetime = 0 使屏幕常亮 
*/
static void initialize(gui_menu_t * menu, void* pvParameter)
{
    menu->interval = 0;
    menu->lifetime = 1; 

    // 记录创建idle view的时间戳，用于按键输入时，检测上一次需要显示的界面
    m_idle_timestamp = em_rtc_get_second_ticks();
}
static void on_set_parent_func(gui_menu_t * menu, const gui_view_t * parent)
{
//    p_this_parent = parent;
}
/* 销毁函数
// 在销毁前处理当前信息，比如不允许销毁时，将当前界面状态保存为background。
// true:  允许销毁
// false: 不允许自动销毁，则GUI只关闭当前显示，输入事件仍由当前view进行处理。
          那么view判断当前状态为background时，作出对应background下的按键、触摸等事件反馈
*/
static uint32_t on_destroy_func(gui_menu_t * menu)
{        
    return GUI_DESTROY_RET_DEFAULT; 
}

/* 显示回调
   重新指定参数, 用来获取当前界面的控件组
   ** 当前界面有多个控件组时，应该有条件确定使用哪一组控件组 ** 
*/
static void display_callback_func(gui_menu_t * menu)
{
    
}

/* 刷新显示回调
   根据当前状态，重新绘制指定的控件组 
*/
static int display_refresh_func(gui_menu_t * menu)
{
    return 0;
}

static void on_touch(void* pvParameters, gui_menu_t * menu)
{
    tp_algo_evt_t* touch = (tp_algo_evt_t*)pvParameters;
//    LOG1("[VIEW-IDLE]: TOUCH->type = %d", touch->type ); 
    const user_system_desc_t* p_sys = xapp_system_current();
    const xapp_battery_desc_t* p_bat_desc = xapp_battery_get_desc();
    
    switch( touch->type )
    {
        case TP_ALGO_EVT_TYPE_CLICK:
        case TP_ALGO_EVT_TYPE_SHORT_READY:
        if( p_bat_desc->charging )
        {
            gui_view_create( &viewNotif_BatteryCharging );
        }
        else 
        {
            gui_view_create( views_load_current_watchface() );
        }
        break;
        
        default:
        break;
    }    
}
/* 界面的按键处理

*/
static void on_button(void* pvParameters, gui_menu_t * menu)
{
    kb_evt_t * kb = (kb_evt_t*)pvParameters;
    const user_system_desc_t* p_sys = xapp_system_current();
    const xapp_battery_desc_t* p_bat_desc = xapp_battery_get_desc();
//    LOG1("[VIEW-IDLE]: kb->type = %d", kb->type ); 
    
    
    switch( kb->type ) 
    {
        case KB_EVT_CLICK:
        {
           if( p_bat_desc->charging )
           {
               gui_view_create( &viewNotif_BatteryCharging );
               break;
           }
           // 未在工作模式 
           if( p_sys->mode != SYSTEM_MODE_NORMAL )
           {
               break;
           }
           // 检查是否有持续界面 
           const gui_desc_t* p_gui_desc =  gui_core_get_desc();
           uint32_t ticks = em_rtc_get_second_ticks();
           if( p_gui_desc->continous_view != NULL )
           {
               gui_view_create( p_gui_desc->continous_view );
               break;
           }
           if( p_gui_desc->func_view != NULL 
                && (ticks - m_idle_timestamp) < IDLE_SHOW_FUNC_VIEW_SECONDS_DELAY  // under 10seconds 
            )
           {
               gui_view_create( p_gui_desc->func_view );     
           }
           else 
            {
                gui_view_create( views_load_current_watchface() ); 
            }            
        }
        break;            
        
        case KB_EVT_SHORT_HOLD_READY:
        {
           if( p_bat_desc->charging )
           {
               gui_view_create( &viewNotif_BatteryCharging );
               break;
           }
           // 未在工作模式 
           if( p_sys->mode != SYSTEM_MODE_NORMAL )
           {
               break;
           }

           gui_view_create( &viewNotif_SOS );//显示SOS界面
           
        }
        break;
        
        case KB_EVT_LONG_HOLD:
        {
            if( p_sys->mode == SYSTEM_MODE_POWER_OFF  )
            {
                // 后缀添加电量检测，如果电量过低，且未在充电时，不允许开机。 
                xapp_system_set_mode( SYSTEM_MODE_RESET ); // 重新开机
            }
        }
        break;

        default:
            break;
    }
 
}

/* 界面的自定义输入事件处理

*/
static void on_event_update(void * pvParameters, gui_menu_t * menu)
{
    custom_evt_t* custom = (custom_evt_t*)pvParameters;
    switch( custom->type )
    {
        case CUSTOM_EVT_TYPE_RAISE_WRIST:
        {
            // 检查是否有持续界面 
           const gui_desc_t* p_gui_desc =  gui_core_get_desc();
           uint32_t ticks = em_rtc_get_second_ticks();
           if( p_gui_desc->continous_view != NULL )
           {
               gui_view_create( p_gui_desc->continous_view );
               break;
           }
           if( p_gui_desc->func_view != NULL 
                && (ticks - m_idle_timestamp) < IDLE_SHOW_FUNC_VIEW_SECONDS_DELAY  // under 10seconds 
            )
           {
               gui_view_create( p_gui_desc->func_view );     
           }
           else 
            {
                gui_view_create( views_load_current_watchface() ); 
            } 
        }
        break;

        case CUSTOM_EVT_TYPE_DROP_WRIST:
        break;
    }
}
